package orders

import (
	"api/internal/svc"
	"api/internal/types"
	"context"
	"fmt"
	"github.com/zeromicro/go-zero/core/logx"
	"net/http"
	"net/url"
	"order_srv/orderclient"
)

type OrderPayLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewOrderPayLogic(ctx context.Context, svcCtx *svc.ServiceContext) *OrderPayLogic {
	return &OrderPayLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *OrderPayLogic) OrderPay(w http.ResponseWriter, r *http.Request) (resp *types.Response, err error) {

	// 1. 原始查询串（保持 URL-Encode）
	raw := r.URL.RawQuery
	logx.Infof("RawQuery = %s", raw)

	// 2. 解析
	values, err := url.ParseQuery(raw) // 解析查询参数
	if err != nil {
		logx.Errorf("解析参数失败：%v", err)
		return nil, err
	}

	// 4. 提取订单号
	outTradeNo := values.Get("out_trade_no")
	if outTradeNo == "" {
		logx.Error("缺少订单号")
		return nil, fmt.Errorf("缺少订单号")
	}

	// 5. 查询订单
	res, err := l.svcCtx.OrderRpc.OrderReturn(l.ctx, &orderclient.OrderReturnRequest{
		OrderSn: outTradeNo,
	})
	if err != nil || res == nil {
		logx.Errorf("查询订单失败：%v", err)
		return nil, err
	}

	// 6. 结构化响应
	return &types.Response{
		Code: 200,
		Message: func() string {
			switch res.PayStatus {
			case 2:
				return "支付成功"
			case 3:
				return "支付失败"
			default:
				return "处理中"
			}
		}(),
		Data: map[string]interface{}{
			"order_sn":     outTradeNo,                 // 订单号
			"trade_no":     values.Get("trade_no"),     // 支付宝交易流水号
			"total_amount": values.Get("total_amount"), // 支付宝支付金额
			"pay_status":   res.PayStatus,
			"pay_msg": func() string {
				switch res.PayStatus {
				case 2:
					return "TRADE_SUCCESS" // 支付宝支付成功
				case 3:
					return "TRADE_CLOSED" // 支付宝支付失败
				default:
					return "WAIT_BUYER_PAY" // 支付宝支付中
				}
			}(),
		},
	}, nil
}
